小编典典

如何在不等待的情况下在 C# 中安全地调用异步方法

all

我有一个async不返回数据的方法:

public async Task MyAsyncMethod()
{
    // do some stuff async, don't return any data
}

我从另一个返回一些数据的方法调用它:

public string GetStringData()
{
    MyAsyncMethod(); // this generates a warning and swallows exceptions
    return "hello world";
}

在没有等待的情况下调用MyAsyncMethod()会导致“因为不等待此调用,当前方法在调用完成之前继续运行”警告在 Visual Studio 中。在该警告的页面上,它指出:

仅当您确定不想等待异步调用完成并且 被调用的方法不会引发任何异常时 ,才应考虑取消警告。

我确定我不想等待通话完成;我不需要也没有时间。 但是调用 可能会 引发异常。

我偶然发现了这个问题几次,我确信这是一个常见的问题,必须有一个共同的解决方案。

如何在不等待结果的情况下安全地调用异步方法?

更新:

对于建议我等待结果的人来说,这是响应我们 Web 服务 (ASP.NET Web API) 上的 Web 请求的代码。在 UI 上下文中等待使 UI
线程保持空闲,但在 Web 请求调用中等待将等待任务完成后再响应请求,从而无缘无故地增加响应时间。


阅读 369

收藏
2022-03-21

共1个答案

小编典典

如果你想“异步”获取异常,你可以这样做:

  MyAsyncMethod().
    ContinueWith(t => Console.WriteLine(t.Exception),
        TaskContinuationOptions.OnlyOnFaulted);

这将允许您处理“主”线程以外的线程上的异常。这意味着您不必“等待”MyAsyncMethod()来自调用 ;
的线程的调用MyAsyncMethod。但是,仍然允许您对异常执行某些操作——但前提是发生异常。

更新:

从技术上讲,你可以做类似的事情await

try
{
    await MyAsyncMethod().ConfigureAwait(false);
}
catch (Exception ex)
{
    Trace.WriteLine(ex);
}

try…如果您需要专门使用/ catch(或)
,这将很有用,using但我发现ContinueWith更明确一点,因为您必须知道什么ConfigureAwait(false)意思。

2022-03-21